Import data
bumbles.df data are cleaned in C2019_HistBumble_DataCleanup.rmd. Briefly, data from GBIF and Bumblebee Watch are combined, cleaned, filtered, and restricted to upper Midwest states.
histag.df data are cleaned and prepped in C2019_HistAg_DataCleanup.Rmd. Not much done other than filtering out population data.
bumbles.df <- read_csv("./analysis_bumbles.csv")
histag.df <- read_csv("./histag_clean.csv")
Data preparation
Split bumble bee data by quantile (equal records per period)
bumbles.df <- bumbles.df %>%
filter(!is.na(year)) %>%
mutate(subgenus = ifelse(species %in% c("Bombus affinis",
"Bombus terricola"),
"Bombus",
ifelse(species %in% c("Bombus griseocollis",
"Bombus rufocinctus",
"Bombus fraternus"),
"Cullumanobombus",
ifelse(species %in% c("Bombus vagans",
"Bombus bimaculatus",
"Bombus impatiens",
"Bombus ternarius",
"Bombus perplexus",
"Bombus sandersoni"),
"Pyrobombus",
ifelse(species %in% c("Bombus auricomus"),
"Bombias",
ifelse(species %in% c("Bombus fervidus",
"Bombus pensylvanicus"),
"Thoracobombus",
ifelse(species %in% c("Bombus citrinus",
"Bombus variabilis",
"Bombus ashtoni"),
"Psithyrus",
"Subterraneobombus")))))))
8 bins
bin8.bumbles.df <- rbin_quantiles(data = bumbles.df,
response = species,
predictor = year,
bins = 8)
bin8.bumbles.df
Binning Summary
-----------------------------
Method Quantile
Response species
Predictor year
Bins 8
Count 26210
Goods 0
Bads 0
Entropy NA
Information Value NA
bumbles.df <- bumbles.df %>%
mutate(bin_8 = case_when(
year < 1924 ~ "1900-1923",
between(year, 1924, 1946) ~ "1924-1946",
between(year, 1947, 1962) ~ "1947-1962",
between(year, 1963, 1968) ~ "1963-1968",
between(year, 1969, 1972) ~ "1969-1972",
between(year, 1973, 1993) ~ "1973-1993",
between(year, 1994, 2013) ~ "1994-2013",
between(year, 2014, 2019) ~ "2013-present"
))
bumbles.df$bin_8 <- factor(bumbles.df$bin_8,
levels = c("1900-1923",
"1924-1946",
"1947-1962",
"1963-1968",
"1969-1972",
"1973-1993",
"1994-2013",
"2013-present"))
table(bumbles.df$bin_8)
1900-1923 1924-1946 1947-1962 1963-1968 1969-1972 1973-1993
2893 3658 3071 2621 4057 3286
1994-2013 2013-present
3313 3311
5 bins
bin5.bumbles.df <- rbin_quantiles(data = bumbles.df,
response = species,
predictor = year,
bins = 5)
bumbles.df <- bumbles.df %>%
mutate(bin_5 = case_when(
year < 1936 ~ "1900-1935",
between(year, 1936, 1963) ~ "1936-1963",
between(year, 1964, 1971) ~ "1964-1971",
between(year, 1972, 2006) ~ "1972-2006",
between(year, 2007, 2019) ~ "2007-present"
))
bumbles.df$bin_5 <- factor(bumbles.df$bin_5,
levels = c("1900-1935",
"1936-1963",
"1964-1971",
"1972-2006",
"2007-present"))
table(bumbles.df$bin_5)
1900-1935 1936-1963 1964-1971 1972-2006 2007-present
5131 5168 4172 6353 5386
3 bins
bin3.bumbles.df <- rbin_quantiles(data = bumbles.df,
response = species,
predictor = year,
bins = 3)
bumbles.df <- bumbles.df %>%
mutate(bin_3 = case_when(
year < 1960 ~ "1900-1959",
between(year, 1960, 1981) ~ "1960-1981",
between(year, 1982, 2019) ~ "1982-present",
))
bumbles.df$bin_3 <- factor(bumbles.df$bin_3,
levels = c("1900-1959",
"1960-1981",
"1982-present"))
table(bumbles.df$bin_3)
1900-1959 1960-1981 1982-present
8397 9075 8738
Rarefied species richness per bin
Per Bartomeus et al. (2013) PNAS paper. Rarefy to 80% of number of specimens in smallest bin. Smallest bin = 1963-1968 @ 2621 * 0.8 = 2097 specimens
JK this is based on Richardson et al. (2018). Using iNEXT.
5 period estimated spp. richness

8 period estimated spp. richness

Permutation test
perm.test <- function(data, n.perm) {
temp.data <- data %>%
filter(order == 0)
true.lm <- lm(qD ~ site,
data = temp.data)
true.r2 <- summary(lm)$r.squared
x <- seq(1, n.perm, 1)
rsq <- list()
order <- list()
for (i in x) {
rand.data.df <- data.frame(temp.data[sample(nrow(temp.data)),])
rand.data.df$time <- seq.int(nrow(rand.data.df))
lm <- lm(qD ~ time,
data = rand.data.df)
rsq[[i]] <- data.frame(summary(lm)$r.squared)
order[[i]] <- data.frame(toString(c(rand.data.df$site)))
}
rsq.df <- bind_rows(rsq)
colnames(rsq.df) <- "r2"
order.df <- bind_rows(order)
colnames(order.df) <- "site_order"
permresults.df <- bind_cols(rsq.df,
order.df)
p.prop <- permresults.df %>%
summarise(p.prop = sum(r2 > true.r2))
p.value <- p.prop / nrow(permresults.df)
assign("permtest.df",
permresults.df,
envir = .GlobalEnv)
print(paste("p-value:",
p.value))
}
perm.test(rareest.8period.df, n.perm = 1000)
perm.test(rareest.5period.df, n.perm = 1000)
Relative abundance over time
by county and 8 period average relative abundance change

by county and 2 period relative abundance change
bumbles.relabun.bycty.df <- bumbles.df %>%
dplyr::select(county, state, species, subgenus, t_period) %>%
group_by(county, state, species, subgenus, t_period) %>%
summarise(n_bumbles = n()) %>%
mutate(state_name = abbr2state(state)) %>%
ungroup()
bumbles.relabun.bycty.df
total.abun.bybin.df <- bumbles.relabun.bycty.df %>%
group_by(t_period, county) %>%
summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.bycty.df <- bumbles.relabun.bycty.df %>%
left_join(total.abun.bybin.df,
by = c("t_period" = "t_period", "county" = "county")) %>%
mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.bycty.df
bumbles.relabun.bycty.df$t_period <- factor(bumbles.relabun.bycty.df$t_period,
levels = c("historical",
"contemp"))
bumbles.relabun.bycty.df
bumbles.deltarelabun.bycty.df
bumbles.deltarelabun.bycty.df <- bumbles.relabun.bycty.df %>%
ungroup() %>%
group_by(county, state, species) %>%
mutate(delta_ra = relative_abun - lead(relative_abun)) %>%
mutate(state_full = abbr2state(state))
bumbles.deltarelabun.bycty.df
bumbles.deltarelabun.bycty.df <- full_join(ungroup(bumbles.deltarelabun.bycty.df),
ungroup(us.county.midwest),
by = c("county" = "CNTY_NAME"))
bumbles.deltarelabun.bycty.plot <- ggplot() +
geom_polygon(data = bumbles.deltarelabun.bycty.df,
mapping = aes(x = long,
y = lat,
fill = delta_ra,
group = group)) +
geom_polygon(data = us.county.midwest,
mapping = aes(x = long,
y = lat,
group = group),
fill = "transparent",
color = "gray80",
size = 0.25,
na.rm = TRUE) +
scale_fill_distiller(type = "div",
palette = "RdYlBu",
na.value = "gray80") +
coord_map("stereographic") +
facet_wrap(~ species,
labeller = as_labeller(species),
ncol = 5) +
theme_void()
bumbles.deltarelabun.bycty.plot

by state
bumbles.relabun.bystate.df <- bumbles.df %>%
dplyr::select(state, species, subgenus, bin_5) %>%
group_by(state, species, subgenus, bin_5) %>%
summarise(n_bumbles = n()) %>%
mutate(state_name = abbr2state(state)) %>%
ungroup()
bumbles.relabun.bystate.df
total.abun.bybin.df <- bumbles.relabun.bystate.df %>%
group_by(bin_5, state) %>%
summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.bystate.df <- bumbles.relabun.bystate.df %>%
left_join(total.abun.bybin.df,
by = c("bin_5" = "bin_5", "state" = "state")) %>%
mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.bystate.df %>%
ungroup() %>%
group_by(species, state) %>%
mutate(delta_ra = c(NA, diff(relative_abun)))
by time bin only
bumbles.relabun.df <- bumbles.df %>%
dplyr::select(state, species, subgenus, bin_5,) %>%
group_by(species, subgenus, bin_5) %>%
summarise(n_bumbles = n()) %>%
ungroup()
bumbles.relabun.df
total.abun.bybin.df <- bumbles.relabun.df %>%
group_by(bin_5) %>%
summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.df <- bumbles.relabun.df %>%
left_join(total.abun.bybin.df,
by = "bin_5") %>%
mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.df <- bumbles.relabun.df %>%
group_by(species) %>%
mutate(time_period_num = row_number())
bumbles.relabun.df
Create area plot to show temporal trends
ggsave("./bumble_area_plot.png",
bumble.area.plot,
width = 7
height = 4)
Error: unexpected symbol in:
" width = 7
height"
Plot each:
by time only
bumbles.relabun.df %>%
ggplot(mapping = aes(label = species)) +
# geom_line(mapping = aes(x = bin,
# y = relative_abun,
# color = species,
# group = species),
# # color = "#EEC643",
# size = 1.25) +
geom_point(mapping = aes(x = bin_5,
y = relative_abun,
color = species),
size = 3) +
# col = "#EEC643",
# alpha = 0.75) +
# geom_text(mapping = aes(x = t_period,
# y = relative_abun + 0.1),
# color = "black") +
# geom_dl(mapping = aes(x = t_period,
# y = relative_abun,
# label = species),
# method = "last.points",
# color = "black") +
geom_smooth(mapping = aes(x = bin_5,
y = relative_abun,
group = species,
color = species),
method = "lm",
linetype = 1,
alpha = 0.1) +
# scale_color_gradient(low = "#382B01",
# high = "#F4E3A7") +
theme_minimal() +
scale_y_continuous(limits = c(-0.05, 0.5)) +
scale_x_discrete(expand = c(0.01, 0.5)) +
# coord_fixed(ratio = 2) +
facet_grid(vars(subgenus))

by state only
bumbles.relabun.bystate.df %>%
ggplot(mapping = aes(label = species)) +
# geom_line(mapping = aes(x = bin,
# y = relative_abun,
# color = species,
# group = species),
# # color = "#EEC643",
# size = 1.25) +
geom_point(mapping = aes(x = bin_5,
y = relative_abun,
color = species),
size = 3) +
# col = "#EEC643",
# alpha = 0.75) +
# geom_text(mapping = aes(x = t_period,
# y = relative_abun + 0.1),
# color = "black") +
# geom_dl(mapping = aes(x = t_period,
# y = relative_abun,
# label = species),
# method = "last.points",
# color = "black") +
geom_smooth(mapping = aes(x = bin_5,
y = relative_abun,
group = species,
color = species),
method = "lm",
linetype = 1,
alpha = 0.1) +
# scale_color_gradient(low = "#382B01",
# high = "#F4E3A7") +
theme_light() +
scale_y_continuous(limits = c(-0.05, 0.75)) +
scale_x_discrete(expand = c(0.01, 0.5)) +
# coord_fixed(ratio = 2) +
facet_grid(vars(subgenus))

by county
bumbles.relabun.bycty.df %>%
ggplot(mapping = aes(label = species)) +
# geom_line(mapping = aes(x = bin,
# y = relative_abun,
# color = species,
# group = species),
# # color = "#EEC643",
# size = 1.25) +
geom_point(mapping = aes(x = bin_8,
y = relative_abun,
color = species),
size = 3) +
# col = "#EEC643",
# alpha = 0.75) +
# geom_text(mapping = aes(x = t_period,
# y = relative_abun + 0.1),
# color = "black") +
# geom_dl(mapping = aes(x = t_period,
# y = relative_abun,
# label = species),
# method = "last.points",
# color = "black") +
geom_smooth(mapping = aes(x = bin_8,
y = relative_abun,
group = species,
color = species),
method = "lm",
linetype = 1,
alpha = 0.1) +
# scale_color_gradient(low = "#382B01",
# high = "#F4E3A7") +
theme_light() +
scale_y_continuous(limits = c(-0.05, 1.0)) +
scale_x_discrete(expand = c(0.01, 0.5)) +
# coord_fixed(ratio = 2) +
facet_grid(vars(subgenus))

Relate change in ag with change in relative abundance
Read in data
bumbles.deltarelabun.df <- read_csv("./bumbles_deltarelabun.csv")
bumbles.species.subgenus.df <- bumbles.df %>%
group_by(species, subgenus) %>%
distinct(species)
bumbles.deltarelabun.df <- bumbles.deltarelabun.df %>%
left_join(bumbles.species.subgenus.df,
by = "species")
midwestag.df <- read_csv("./midwestag.csv")
Combine data
bumble.by.ag.df <- midwestag.df %>%
dplyr::select(STATE_NAME,
CNTY_NAME,
SUB_REGION,
ag_stat_name,
ag_stat_value,
year,
stat,
ag_delta) %>%
group_by(STATE_NAME, CNTY_NAME, stat) %>%
summarise(mean_ag_delta = mean(ag_delta,
na.rm = TRUE)) %>%
left_join(bumbles.deltarelabun.df,
by = c("CNTY_NAME" = "county",
"STATE_NAME" = "state_full"))
Plot delta_ag vs delta_relabun by species w/overall average
bumble.by.ag.plot <- bumble.by.ag.df %>%
filter(stat == "RATIO") %>%
filter(!is.na(mean_delta_ra)) %>%
ggplot() +
geom_vline(xintercept = 0.0,
color = "black",
size = 0.75,
alpha = 0.25) +
geom_hline(yintercept = 0.0,
color = "black",
size = 0.75,
alpha = 0.25) +
geom_point(mapping = aes(x = mean_ag_delta,
y = mean_delta_ra,
fill = species),
shape = 21,
color = "black") +
geom_smooth(mapping = aes(x = mean_ag_delta,
y = mean_delta_ra,
group = species,
color = species),
method = "lm",
se = FALSE) +
# geom_smooth(mapping = aes(x = mean_ag_delta,
# y = mean_delta_ra),
# method = "lm",
# color = "red",
# size = 1.5) +
xlim(-0.025, 0.075) +
ylim(-1, 1) +
xlab("Mean change in county-level proportion ag") +
ylab("Mean change in relative abundance") +
scale_fill_viridis_d(option = "inferno",
direction = 1) +
scale_color_viridis_d(option = "inferno",
direction = 1) +
facet_wrap(~ subgenus,
ncol = 4) +
theme_minimal() +
theme(legend.position = "none") +
theme(panel.border = element_rect(color = "gray50",
size = 1.25,
fill = "transparent"))
bumble.by.ag.plot <- direct.label(bumble.by.ag.plot,
list("extreme.grid",
cex = 0.5))
bumble.by.ag.plot
ggsave("./bumble_byag_plot.png",
bumble.by.ag.plot,
height = 4.5,
width = 7)

Density plot of county-level average ag change for each state
ggplot() +
geom_vline(xintercept = 0.0,
color = "red",
size = 1.5,
alpha = 0.5) +
geom_density(data = bumble.by.ag.df %>%
filter(stat == "RATIO") %>%
filter(!is.na(mean_delta_ra)),
mapping = aes(x = mean_ag_delta,
fill = state),
alpha = 0.75) +
scale_fill_viridis_d(option = "inferno",
direction = 1) +
theme_minimal()

Plot ag ratio vs delta_relabun by species w/overall average
bumble.by.agratio.plot <- midwestag.df %>%
dplyr::select(STATE_NAME,
CNTY_NAME,
SUB_REGION,
ag_stat_name,
ag_stat_value,
year,
stat,
ag_delta) %>%
filter(stat == "RATIO") %>%
group_by(STATE_NAME, CNTY_NAME) %>%
summarise(mean_ag = mean(ag_stat_value,
na.rm = TRUE)) %>%
left_join(bumbles.deltarelabun.df,
by = c("CNTY_NAME" = "county",
"STATE_NAME" = "state_full")) %>%
filter(!is.na(mean_delta_ra)) %>%
ggplot() +
geom_hline(yintercept = 0,
color = "black",
alpha = 0.25) +
geom_point(mapping = aes(x = mean_ag,
y = mean_delta_ra,
fill = species),
shape = 21,
color = "black") +
geom_smooth(mapping = aes(x = mean_ag,
y = mean_delta_ra,
group = species,
color = species),
method = "lm",
se = FALSE) +
# geom_smooth(mapping = aes(x = mean_ag,
# y = mean_delta_ra),
# method = "lm",
# color = "red",
# size = 1.5) +
xlim(0, 1) +
ylim(-1, 1) +
xlab("Mean county-level proportion ag") +
ylab("Mean change in relative abundance") +
scale_fill_viridis_d(option = "inferno",
direction = 1) +
scale_color_viridis_d(option = "inferno",
direction = 1) +
facet_wrap(~ subgenus,
ncol = 4) +
theme_minimal() +
theme(legend.position = "none") +
theme(panel.border = element_rect(color = "gray50",
size = 1.25,
fill = "transparent"))
bumble.by.agratio.plot <- direct.label(bumble.by.agratio.plot,
list("smart.grid",
cex = 0.5))
Removed 1 rows containing non-finite values (stat_smooth).
bumble.by.agratio.plot
ggsave("./bumble_byagratio_plot.png",
bumble.by.agratio.plot,
height = 4.5,
width = 7)

LS0tCnRpdGxlOiAiQ2g0IHwgSGlzdG9yaWNhbCBBZyAmIEJ1bWJsZSBCZWUgQWJ1bmRhbmNlL0NvbW11bml0eSBDaGFuZ2VzIgpzdWJ0aXRsZTogIkhpc3RvcmljYWwgYnVtYmxlIGJlZSBkYXRhIGNvbWJpbmF0aW9uIGFuZCBtb2RlbGluZyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoqKk5hbWU6KiogSmVyZW15IEhlbWJlcmdlcgoqKkVtYWlsOioqIGouaGVtYmVyZ2VyLndpc2NAZ21haWwuY29tCioqSW5zdGl0dXRpb246KiogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gLSBNYWRpc29uIHwgRGVwYXJ0bWVudCBvZiBFbnRvbW9sb2d5CgojIEltcG9ydCBwYWNrYWdlcwpgYGB7cn0gCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJnZGFsKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdnYWx0KQpsaWJyYXJ5KGdnZm9yY2UpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkobWFwdG9vbHMpCmxpYnJhcnkobWFwcykKbGlicmFyeShtYXBkYXRhKQpsaWJyYXJ5KG1wKQpsaWJyYXJ5KHZlZ2FuKQpsaWJyYXJ5KGlORVhUKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGNvaW4pCmxpYnJhcnkocmJpbikKbGlicmFyeShkaXJlY3RsYWJlbHMpCmBgYAoKIyBJbXBvcnQgZGF0YQpgYnVtYmxlcy5kZmAgZGF0YSBhcmUgY2xlYW5lZCBpbiBgQzIwMTlfSGlzdEJ1bWJsZV9EYXRhQ2xlYW51cC5ybWRgLiAgQnJpZWZseSwgZGF0YSBmcm9tIEdCSUYgYW5kIEJ1bWJsZWJlZSBXYXRjaCBhcmUgY29tYmluZWQsIGNsZWFuZWQsIGZpbHRlcmVkLCBhbmQgcmVzdHJpY3RlZCB0byB1cHBlciBNaWR3ZXN0IHN0YXRlcy4gIAoKYGhpc3RhZy5kZmAgZGF0YSBhcmUgY2xlYW5lZCBhbmQgcHJlcHBlZCBpbiBgQzIwMTlfSGlzdEFnX0RhdGFDbGVhbnVwLlJtZGAuICBOb3QgbXVjaCBkb25lIG90aGVyIHRoYW4gZmlsdGVyaW5nIG91dCBwb3B1bGF0aW9uIGRhdGEuCmBgYHtyfQpidW1ibGVzLmRmIDwtIHJlYWRfY3N2KCIuL2FuYWx5c2lzX2J1bWJsZXMuY3N2IikKaGlzdGFnLmRmIDwtIHJlYWRfY3N2KCIuL2hpc3RhZ19jbGVhbi5jc3YiKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbiAKIyMgU3BsaXQgYnVtYmxlIGJlZSBkYXRhIGJ5IHF1YW50aWxlIChlcXVhbCByZWNvcmRzIHBlciBwZXJpb2QpCmBgYHtyfQpidW1ibGVzLmRmIDwtIGJ1bWJsZXMuZGYgJT4lCiAgZmlsdGVyKCFpcy5uYSh5ZWFyKSkgJT4lCiAgbXV0YXRlKHN1YmdlbnVzID0gaWZlbHNlKHNwZWNpZXMgJWluJSBjKCJCb21idXMgYWZmaW5pcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgdGVycmljb2xhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBncmlzZW9jb2xsaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBydWZvY2luY3R1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIGZyYXRlcm51cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1bGx1bWFub2JvbWJ1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyB2YWdhbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgYmltYWN1bGF0dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgaW1wYXRpZW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIHRlcm5hcml1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBwZXJwbGV4dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgc2FuZGVyc29uaSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXJvYm9tYnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBhdXJpY29tdXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJpYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBmZXJ2aWR1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIHBlbnN5bHZhbmljdXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaG9yYWNvYm9tYnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzcGVjaWVzICVpbiUgYygiQm9tYnVzIGNpdHJpbnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyB2YXJpYWJpbGlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBhc2h0b25pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzaXRoeXJ1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YnRlcnJhbmVvYm9tYnVzIikpKSkpKSkKYGBgCgojIyA4IGJpbnMKYGBge3J9CmJpbjguYnVtYmxlcy5kZiA8LSByYmluX3F1YW50aWxlcyhkYXRhID0gYnVtYmxlcy5kZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3IgPSB5ZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucyA9IDgpCmJ1bWJsZXMuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBtdXRhdGUoYmluXzggPSBjYXNlX3doZW4oCiAgICB5ZWFyIDwgMTkyNCB+ICIxODI0LTE5MjMiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTI0LCAxOTQ2KSB+ICIxOTI0LTE5NDYiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTQ3LCAxOTYyKSB+ICIxOTQ3LTE5NjIiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTYzLCAxOTY4KSB+ICIxOTYzLTE5NjgiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTY5LCAxOTcyKSB+ICIxOTY5LTE5NzIiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTczLCAxOTkzKSB+ICIxOTczLTE5OTMiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTk0LCAyMDEzKSB+ICIxOTk0LTIwMTMiLAogICAgYmV0d2Vlbih5ZWFyLCAyMDE0LCAyMDE5KSB+ICIyMDEzLXByZXNlbnQiCiAgKSkKYnVtYmxlcy5kZiRiaW5fOCA8LSBmYWN0b3IoYnVtYmxlcy5kZiRiaW5fOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMTgyNC0xOTIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTkyNC0xOTQ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk0Ny0xOTYyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2My0xOTY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2OS0xOTcyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk3My0xOTkzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk5NC0yMDEzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxMy1wcmVzZW50IikpCnRhYmxlKGJ1bWJsZXMuZGYkYmluXzgpCmBgYAoKIyMgNSBiaW5zCmBgYHtyfQpiaW41LmJ1bWJsZXMuZGYgPC0gcmJpbl9xdWFudGlsZXMoZGF0YSA9IGJ1bWJsZXMuZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnMgPSA1KQpidW1ibGVzLmRmIDwtIGJ1bWJsZXMuZGYgJT4lCiAgbXV0YXRlKGJpbl81ID0gY2FzZV93aGVuKAogICAgeWVhciA8IDE5MzYgfiAiMTgyNC0xOTM1IiwKICAgIGJldHdlZW4oeWVhciwgMTkzNiwgMTk2MykgfiAiMTkzNi0xOTYzIiwKICAgIGJldHdlZW4oeWVhciwgMTk2NCwgMTk3MSkgfiAiMTk2NC0xOTcxIiwKICAgIGJldHdlZW4oeWVhciwgMTk3MiwgMjAwNikgfiAiMTk3Mi0yMDA2IiwKICAgIGJldHdlZW4oeWVhciwgMjAwNywgMjAxOSkgfiAiMjAwNy1wcmVzZW50IgogICkpCmJ1bWJsZXMuZGYkYmluXzUgPC0gZmFjdG9yKGJ1bWJsZXMuZGYkYmluXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjE4MjQtMTkzNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5MzYtMTk2MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NjQtMTk3MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NzItMjAwNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDctcHJlc2VudCIpKQp0YWJsZShidW1ibGVzLmRmJGJpbl81KQpgYGAKCiMjIDMgYmlucwpgYGB7cn0KYmluMy5idW1ibGVzLmRmIDwtIHJiaW5fcXVhbnRpbGVzKGRhdGEgPSBidW1ibGVzLmRmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciA9IHllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zID0gMykKYnVtYmxlcy5kZiA8LSBidW1ibGVzLmRmICU+JQogIG11dGF0ZShiaW5fMyA9IGNhc2Vfd2hlbigKICAgIHllYXIgPCAxOTYwIH4gIjE4MjQtMTk1OSIsCiAgICBiZXR3ZWVuKHllYXIsIDE5NjAsIDE5ODEpIH4gIjE5NjAtMTk4MSIsCiAgICBiZXR3ZWVuKHllYXIsIDE5ODIsIDIwMTkpIH4gIjE5ODItcHJlc2VudCIsCiAgKSkKYnVtYmxlcy5kZiRiaW5fMyA8LSBmYWN0b3IoYnVtYmxlcy5kZiRiaW5fMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMTkwMC0xOTU5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2MC0xOTgxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk4Mi1wcmVzZW50IikpCnRhYmxlKGJ1bWJsZXMuZGYkYmluXzMpCmBgYAoKYGBge3J9CgpgYGAKCiMjIFJhcmVmaWVkIHNwZWNpZXMgcmljaG5lc3MgcGVyIGJpbgpQZXIgQmFydG9tZXVzIGV0IGFsLiAoMjAxMykgUE5BUyBwYXBlci4gIFJhcmVmeSB0byA4MCUgb2YgbnVtYmVyIG9mIHNwZWNpbWVucyBpbiBzbWFsbGVzdCBiaW4uICBTbWFsbGVzdCBiaW4gPSAxOTYzLTE5NjggQCAyNjIxICogMC44ID0gKjIwOTcgc3BlY2ltZW5zKgoKSksgdGhpcyBpcyBiYXNlZCBvbiBSaWNoYXJkc29uIGV0IGFsLiAoMjAxOCkuICBVc2luZyBgaU5FWFRgLiAgCgojIyMgNSBwZXJpb2QgZXN0aW1hdGVkIHNwcC4gcmljaG5lc3MKYGBge3J9CnJhcmUuYnVtYmxlcy5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3BlY2llcywgdF9wZXJpb2QsIGJpbl8zLCBiaW5fNSwgYmluXzgpCnJhcmUuYnVtYmxlcy41YmluLmRmIDwtIHJhcmUuYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KHNwZWNpZXMsIGJpbl81KSAlPiUKICBncm91cF9ieShiaW5fNSkgJT4lCiAgY291bnQoc3BlY2llcykKcmFyZS5idW1ibGVzLjVwZXJpb2QuZGYgPC0gZGF0YS5mcmFtZSh0aW1lX2JpbiA9IHJhcmUuYnVtYmxlcy41YmluLmRmJGJpbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFidW4gPSByYXJlLmJ1bWJsZXMuNWJpbi5kZiRuKQpyYXJlLmJ1bWJsZXMuNXBlcmlvZCA8LSBsaXN0KCIxIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTkwMC0xOTM1Il0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTkzNi0xOTYzIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTk2NC0xOTcxIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTk3Mi0yMDA2Il0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMjAwNy1wcmVzZW50Il0pKQpyYXJlLjVwZXJpb2QuZGYgPC0gaU5FWFQocmFyZS5idW1ibGVzLjVwZXJpb2QsIAogICAgICAgICAgICAgcSA9IDAsCiAgICAgICAgICAgICBkYXRhdHlwZSA9ICJhYnVuZGFuY2UiLAogICAgICAgICAgICAga25vdHMgPSAyMDAsCiAgICAgICAgICAgICAjIGVuZHBvaW50ID0gMjUsMDAwLAogICAgICAgICAgICAgbmJvb3QgPSA1MDApCmdnaU5FWFQocmFyZS41cGVyaW9kLmRmLAogICAgICAgIGNvbG9yLnZhciA9ICJzaXRlIikKcmFyZWVzdC41cGVyaW9kLmRmIDwtIGVzdGltYXRlRChyYXJlLmJ1bWJsZXMuNXBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9ICJhYnVuZGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAiY292ZXJhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMC45ODUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IDAuOTUpCnJhcmVlc3QuNXBlcmlvZC5kZiRzaXRlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJhcmVlc3QuNXBlcmlvZC5kZiRzaXRlKSkKcmFyZWVzdC41cGVyaW9kLnBsb3QgPC0gcmFyZWVzdC41cGVyaW9kLmRmICU+JQogIGZpbHRlcihvcmRlciA9PSAwKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fcG9pbnRyYW5nZShtYXBwaW5nID0gYWVzKHggPSBzaXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IHFELkxDTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gcUQuVUNMKSwKICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuOCkgKwogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IHNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcUQpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogIHRoZW1lX21pbmltYWwoKQpyYXJlZXN0LjVwZXJpb2QucGxvdApgYGAKCiMjIyA4IHBlcmlvZCBlc3RpbWF0ZWQgc3BwLiByaWNobmVzcwpgYGB7cn0KcmFyZS5idW1ibGVzLjhiaW4uZGYgPC0gcmFyZS5idW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3BlY2llcywgYmluXzgpICU+JQogIGdyb3VwX2J5KGJpbl84KSAlPiUKICBjb3VudChzcGVjaWVzKQpyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiA8LSBkYXRhLmZyYW1lKHRpbWVfYmluID0gcmFyZS5idW1ibGVzLjhiaW4uZGYkYmluXzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJ1biA9IHJhcmUuYnVtYmxlcy44YmluLmRmJG4pCnJhcmUuYnVtYmxlcy44cGVyaW9kIDwtIGxpc3QoIjEiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTAwLTE5MjMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTI0LTE5NDYiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTQ3LTE5NjIiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTYzLTE5NjgiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTY5LTE5NzIiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTczLTE5OTMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTk0LTIwMTMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIyMDEzLXByZXNlbnQiXSkpCnJhcmUuOHBlcmlvZC5kZiA8LSBpTkVYVChyYXJlLmJ1bWJsZXMuOHBlcmlvZCwgCiAgICAgICAgICAgICBxID0gMCwKICAgICAgICAgICAgIGRhdGF0eXBlID0gImFidW5kYW5jZSIsCiAgICAgICAgICAgICBrbm90cyA9IDIwMCwKICAgICAgICAgICAgICMgZW5kcG9pbnQgPSAyNSwwMDAsCiAgICAgICAgICAgICBuYm9vdCA9IDUwMCkKZ2dpTkVYVChyYXJlLjhwZXJpb2QuZGYsCiAgICAgICAgY29sb3IudmFyID0gInNpdGUiKQpyYXJlZXN0LjhwZXJpb2QuZGYgPC0gZXN0aW1hdGVEKHJhcmUuYnVtYmxlcy44cGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gImFidW5kYW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9ICJjb3ZlcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwLjk4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gMC45NSkKcmFyZWVzdC44cGVyaW9kLmRmJHNpdGUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmFyZWVzdC44cGVyaW9kLmRmJHNpdGUpKQpyYXJlZXN0LjhwZXJpb2QucGxvdCA8LSByYXJlZXN0LjhwZXJpb2QuZGYgJT4lCiAgZmlsdGVyKG9yZGVyID09IDApICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9wb2ludHJhbmdlKG1hcHBpbmcgPSBhZXMoeCA9IHNpdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBxRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gcUQuTENMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBxRC5VQ0wpLAogICAgICAgICAgICAgICAgICBzaXplID0gMC44KSArCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBxRCksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgeWxhYigiRXN0aW1hdGVkIHNwZWNpZXMgcmljaG5lc3MiKSArIAogIHhsYWIoIlRpbWUgUGVyaW9kIikgKyAKICB0aGVtZV9jbGFzc2ljKCkKcmFyZWVzdC44cGVyaW9kLnBsb3QKYGBgCgojIyMjIFBlcm11dGF0aW9uIHRlc3QKYGBge3J9CnBlcm0udGVzdCA8LSBmdW5jdGlvbihkYXRhLCBuLnBlcm0pIHsKICB0ZW1wLmRhdGEgPC0gZGF0YSAlPiUKICAgIGZpbHRlcihvcmRlciA9PSAwKQogIHRydWUubG0gPC0gbG0ocUQgfiBzaXRlLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXAuZGF0YSkKICB0cnVlLnIyIDwtIHN1bW1hcnkobG0pJHIuc3F1YXJlZAogIHggPC0gc2VxKDEsIG4ucGVybSwgMSkKICByc3EgPC0gbGlzdCgpCiAgb3JkZXIgPC0gbGlzdCgpCiAgZm9yIChpIGluIHgpIHsKICAgIHJhbmQuZGF0YS5kZiA8LSBkYXRhLmZyYW1lKHRlbXAuZGF0YVtzYW1wbGUobnJvdyh0ZW1wLmRhdGEpKSxdKQogICAgcmFuZC5kYXRhLmRmJHRpbWUgPC0gc2VxLmludChucm93KHJhbmQuZGF0YS5kZikpCiAgICBsbSA8LSBsbShxRCB+IHRpbWUsCiAgICAgICAgICAgICBkYXRhID0gcmFuZC5kYXRhLmRmKQogICAgcnNxW1tpXV0gPC0gZGF0YS5mcmFtZShzdW1tYXJ5KGxtKSRyLnNxdWFyZWQpCiAgICBvcmRlcltbaV1dIDwtIGRhdGEuZnJhbWUodG9TdHJpbmcoYyhyYW5kLmRhdGEuZGYkc2l0ZSkpKQogIH0KICByc3EuZGYgPC0gYmluZF9yb3dzKHJzcSkKICBjb2xuYW1lcyhyc3EuZGYpIDwtICJyMiIKICBvcmRlci5kZiA8LSBiaW5kX3Jvd3Mob3JkZXIpCiAgY29sbmFtZXMob3JkZXIuZGYpIDwtICJzaXRlX29yZGVyIgogIHBlcm1yZXN1bHRzLmRmIDwtIGJpbmRfY29scyhyc3EuZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5kZikKICBwLnByb3AgPC0gcGVybXJlc3VsdHMuZGYgJT4lCiAgICBzdW1tYXJpc2UocC5wcm9wID0gc3VtKHIyID4gdHJ1ZS5yMikpCiAgcC52YWx1ZSA8LSBwLnByb3AgLyBucm93KHBlcm1yZXN1bHRzLmRmKQogIGFzc2lnbigicGVybXRlc3QuZGYiLAogICAgICAgICBwZXJtcmVzdWx0cy5kZiwKICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogIHByaW50KHBhc3RlKCJwLXZhbHVlOiIsCiAgICAgICAgICAgICAgcC52YWx1ZSkpCn0KcGVybS50ZXN0KHJhcmVlc3QuOHBlcmlvZC5kZiwgbi5wZXJtID0gMTAwMCkKcGVybS50ZXN0KHJhcmVlc3QuNXBlcmlvZC5kZiwgbi5wZXJtID0gMTAwMCkKYGBgCgoKIyBSZWxhdGl2ZSBhYnVuZGFuY2Ugb3ZlciB0aW1lCiMjIGJ5ICoqX2NvdW50eV8qKiBhbmQgOCBwZXJpb2QgYXZlcmFnZSByZWxhdGl2ZSBhYnVuZGFuY2UgY2hhbmdlCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KGNvdW50eSwgc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fOCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcywgc3ViZ2VudXMsIGJpbl84KSAlPiUKICBzdW1tYXJpc2Uobl9idW1ibGVzID0gbigpKSAlPiUKICBtdXRhdGUoc3RhdGVfbmFtZSA9IGFiYnIyc3RhdGUoc3RhdGUpKSAlPiUKICB1bmdyb3VwKCkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGdyb3VwX2J5KGJpbl84LCBjb3VudHkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9idW1ibGVzID0gc3VtKG5fYnVtYmxlcykpCnRvdGFsLmFidW4uYnliaW4uZGYKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBsZWZ0X2pvaW4odG90YWwuYWJ1bi5ieWJpbi5kZiwKICAgICAgICAgICAgYnkgPSBjKCJiaW5fOCIgPSAiYmluXzgiLCAiY291bnR5IiA9ICJjb3VudHkiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQoKIyBDYWxjdWxhdGUgY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZSBieSBjb3VudHkgb3ZlciB0aW1lIGJpbnMKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShjb3VudHksIHN0YXRlLCBzcGVjaWVzKSAlPiUKICBtdXRhdGUoZGVsdGFfcmEgPSByZWxhdGl2ZV9hYnVuIC0gbGFnKHJlbGF0aXZlX2FidW4pKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kZWx0YV9yYSA9IG1lYW4oZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpICU+JQogIG11dGF0ZShzdGF0ZV9mdWxsID0gYWJicjJzdGF0ZShzdGF0ZSkpCgp3cml0ZV9jc3YoYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYsCiAgICAgICAgICAiYnVtYmxlc19kZWx0YXJlbGFidW4uY3N2IikKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtICBmdWxsX2pvaW4odW5ncm91cChidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCh1cy5jb3VudHkubWlkd2VzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiID0gIkNOVFlfTkFNRSIpKQogCgpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBtdXRhdGUoaW5jX2RlYyA9IGNhc2Vfd2hlbihtZWFuX2RlbHRhX3JhIDwgLTAuMDUgfiAiRGVjcmVhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4obWVhbl9kZWx0YV9yYSwgLTAuMDI1LCAwLjAyNSkgfiAiTm8gY2hhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2RlbHRhX3JhID4gMC4wNSB+ICJJbmNyZWFzZSIpKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5wbG90IDwtIGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGZpbHRlcighaXMubmEoaW5jX2RlYykpICU+JQogIGZpbHRlcighKHNwZWNpZXMgJWluJSBjKCJCb21idXMgZnJhdGVybnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIGFzaHRvbmkiKSkpICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9wb2x5Z29uKG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gaW5jX2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgYWxwaGEgPSAwLjgpICsgICAgICAgICAgICAgCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1cy5jb3VudHkubWlkd2VzdCwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JheTgwIiwKICAgICAgICAgICAgICAgc2l6ZSA9IDAuMjUsCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjQzA1NzQ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNTU3RjMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQ0NGNEFCIikpICsKICAjIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHR5cGUgPSAiZGl2IiwKICAjICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmRZbEJ1IiwKICAjICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IikgKwogIGNvb3JkX21hcCgic3RlcmVvZ3JhcGhpYyIpICsKICBmYWNldF93cmFwKH4gc3BlY2llcywKICAgICAgICAgICAgIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoc3BlY2llcyksCiAgICAgICAgICAgICBuY29sID0gNSkgKyAKICB0aGVtZV92b2lkKCkKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdAoKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuaGlzdCA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKGluY19kZWMpKSAlPiUKICBmaWx0ZXIoIShzcGVjaWVzICVpbiUgYygiQm9tYnVzIGZyYXRlcm51cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBhc2h0b25pIikpKSAlPiUKICBncm91cF9ieShzcGVjaWVzLCBpbmNfZGVjKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KCkgKyAKICAjIGdlb21fdmxpbmUobWFwcGluZyA9IGFlcyh4aW50ZXJjZXB0ID0gMCksCiAgIyAgICAgICAgICAgIGNvbG9yID0gInRvbWF0byIsCiAgIyAgICAgICAgICAgIHNpemUgPSAwLjUsCiAgIyAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgIyBnZW9tX2RlbnNpdHkobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9kZWx0YV9yYSksCiAgIyAgICAgICAgICAgICAgYWRqdXN0ID0gNSwKICAjICAgICAgICAgICAgICBmaWxsID0gImdvbGRlbnJvZCIsCiAgIyAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gaW5jX2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBuLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGluY19kZWMpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNDMDU3NDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM1NTdGMzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNDQ0Y0QUIiKSkgKwogIGZhY2V0X3dyYXAofiBzcGVjaWVzLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBhc19sYWJlbGxlcihzcGVjaWVzKSwKICAgICAgICAgICAgIG5jb2wgPSA1KSArIAogIHRoZW1lX21pbmltYWxfaGdyaWQoKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5oaXN0CmBgYAoKIyMgYnkgKipfY291bnR5XyoqIGFuZCAyIHBlcmlvZCByZWxhdGl2ZSBhYnVuZGFuY2UgY2hhbmdlCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KGNvdW50eSwgc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCB0X3BlcmlvZCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcywgc3ViZ2VudXMsIHRfcGVyaW9kKSAlPiUKICBzdW1tYXJpc2Uobl9idW1ibGVzID0gbigpKSAlPiUKICBtdXRhdGUoc3RhdGVfbmFtZSA9IGFiYnIyc3RhdGUoc3RhdGUpKSAlPiUKICB1bmdyb3VwKCkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGdyb3VwX2J5KHRfcGVyaW9kLCBjb3VudHkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9idW1ibGVzID0gc3VtKG5fYnVtYmxlcykpCnRvdGFsLmFidW4uYnliaW4uZGYKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBsZWZ0X2pvaW4odG90YWwuYWJ1bi5ieWJpbi5kZiwKICAgICAgICAgICAgYnkgPSBjKCJ0X3BlcmlvZCIgPSAidF9wZXJpb2QiLCAiY291bnR5IiA9ICJjb3VudHkiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYKCmJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiR0X3BlcmlvZCA8LSBmYWN0b3IoYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmJHRfcGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImhpc3RvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbXAiKSkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcykgJT4lCiAgbXV0YXRlKGRlbHRhX3JhID0gcmVsYXRpdmVfYWJ1biAtIGxlYWQocmVsYXRpdmVfYWJ1bikpICU+JQogIG11dGF0ZShzdGF0ZV9mdWxsID0gYWJicjJzdGF0ZShzdGF0ZSkpCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtICBmdWxsX2pvaW4odW5ncm91cChidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCh1cy5jb3VudHkubWlkd2VzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiID0gIkNOVFlfTkFNRSIpKQoKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdCA8LSBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbihkYXRhID0gYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYsCiAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCkpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzLmNvdW50eS5taWR3ZXN0LAogICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLAogICAgICAgICAgICAgICBjb2xvciA9ICJncmF5ODAiLAogICAgICAgICAgICAgICBzaXplID0gMC4yNSwKICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHR5cGUgPSAiZGl2IiwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTgwIikgKwogIGNvb3JkX21hcCgic3RlcmVvZ3JhcGhpYyIpICsKICBmYWNldF93cmFwKH4gc3BlY2llcywKICAgICAgICAgICAgIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoc3BlY2llcyksCiAgICAgICAgICAgICBuY29sID0gNSkgKyAKICB0aGVtZV92b2lkKCkKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdApgYGAKCiMjIGJ5ICoqX3N0YXRlXyoqCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgZ3JvdXBfYnkoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKG5fYnVtYmxlcyA9IG4oKSkgJT4lCiAgbXV0YXRlKHN0YXRlX25hbWUgPSBhYmJyMnN0YXRlKHN0YXRlKSkgJT4lCiAgdW5ncm91cCgpCmJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5c3RhdGUuZGYgJT4lCiAgZ3JvdXBfYnkoYmluXzUsIHN0YXRlKSAlPiUKICBzdW1tYXJpc2UodG90YWxfYnVtYmxlcyA9IHN1bShuX2J1bWJsZXMpKQp0b3RhbC5hYnVuLmJ5YmluLmRmCmJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmICU+JQogIGxlZnRfam9pbih0b3RhbC5hYnVuLmJ5YmluLmRmLAogICAgICAgICAgICBieSA9IGMoImJpbl81IiA9ICJiaW5fNSIsICJzdGF0ZSIgPSAic3RhdGUiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc3BlY2llcywgc3RhdGUpICU+JQogIG11dGF0ZShkZWx0YV9yYSA9IGMoTkEsIGRpZmYocmVsYXRpdmVfYWJ1bikpKQpgYGAKCiMjIGJ5ICoqX3RpbWUgYmluIG9ubHlfKioKYGBge3J9CmJ1bWJsZXMucmVsYWJ1bi5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSwpICU+JQogIGdyb3VwX2J5KHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKG5fYnVtYmxlcyA9IG4oKSkgJT4lCiAgdW5ncm91cCgpCmJ1bWJsZXMucmVsYWJ1bi5kZgp0b3RhbC5hYnVuLmJ5YmluLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5kZiAlPiUKICBncm91cF9ieShiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2J1bWJsZXMgPSBzdW0obl9idW1ibGVzKSkKdG90YWwuYWJ1bi5ieWJpbi5kZgpidW1ibGVzLnJlbGFidW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmRmICU+JQogIGxlZnRfam9pbih0b3RhbC5hYnVuLmJ5YmluLmRmLAogICAgICAgICAgICBieSA9ICJiaW5fNSIpICU+JQogIG11dGF0ZShyZWxhdGl2ZV9hYnVuID0gbl9idW1ibGVzIC8gdG90YWxfYnVtYmxlcykKYnVtYmxlcy5yZWxhYnVuLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5kZiAlPiUKICBncm91cF9ieShzcGVjaWVzKSAlPiUKICBtdXRhdGUodGltZV9wZXJpb2RfbnVtID0gcm93X251bWJlcigpKQpidW1ibGVzLnJlbGFidW4uZGYKYGBgCgojIyMgQ3JlYXRlIGFyZWEgcGxvdCB0byBzaG93IHRlbXBvcmFsIHRyZW5kcwpgYGB7cn0KYnVtYmxlLmFyZWEucGxvdCA8LSBidW1ibGVzLnJlbGFidW4uZGYgJT4lCiAgZ3JvdXBfYnkodGltZV9wZXJpb2RfbnVtKSAlPiUKICBhcnJhbmdlKHJlbGF0aXZlX2FidW4sIAogICAgICAgICAgLmJ5X2dyb3VwID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNwZWNpZXNfZmFjdG9yID0gZmFjdG9yKHNwZWNpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKC4kc3BlY2llc1suJHRpbWVfcGVyaW9kX251bSA9PSAzXSkpKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYXJlYShtYXBwaW5nID0gYWVzKHggPSB0aW1lX3BlcmlvZF9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHNwZWNpZXNfZmFjdG9yKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gRkFMU0UpKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxKSArCiAgZmFjZXRfd3JhcCh+IHN1YmdlbnVzKSArIAogIHRoZW1lX21pbmltYWwoKQpidW1ibGUuYXJlYS5wbG90Cmdnc2F2ZSgiLi9idW1ibGVfYXJlYV9wbG90LnBuZyIsCiAgICAgICBidW1ibGUuYXJlYS5wbG90LAogICAgICAgd2lkdGggPSA3LAogICAgICAgaGVpZ2h0ID0gNCkKYGBgCgoKIyMgUGxvdCBlYWNoOiAKIyMjIGJ5ICoqX3RpbWUgb25seV8qKgpgYGB7cn0KYnVtYmxlcy5yZWxhYnVuLmRmICU+JQogIGdncGxvdChtYXBwaW5nID0gYWVzKGxhYmVsID0gc3BlY2llcykpICsgCiAgIyBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gYmluLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHNwZWNpZXMsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNwZWNpZXMpLAogICMgICAgICAgICAgICMgY29sb3IgPSAiI0VFQzY0MyIsCiAgIyAgICAgICAgICAgc2l6ZSA9IDEuMjUpICsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGJpbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgIHNpemUgPSAzKSArIAogICAgICAgICAgICAgIyBjb2wgPSAiI0VFQzY0MyIsCiAgICAgICAgICAgICAjIGFscGhhID0gMC43NSkgKyAKICAjIGdlb21fdGV4dChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuICsgMC4xKSwKICAjICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgIyBnZW9tX2RsKG1hcHBpbmcgPSBhZXMoeCA9IHRfcGVyaW9kLAogICMgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3BlY2llcyksCiAgIyAgICAgICAgIG1ldGhvZCA9ICJsYXN0LnBvaW50cyIsCiAgIyAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBiaW5fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIGxpbmV0eXBlID0gMSwKICAgICAgICAgICAgICBhbHBoYSA9IDAuMSkgKwogICMgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gIiMzODJCMDEiLAogICMgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICIjRjRFM0E3IikgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4wNSwgMC41KSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMC41KSkgKyAKICAjIGNvb3JkX2ZpeGVkKHJhdGlvID0gMikgKyAKICBmYWNldF9ncmlkKHZhcnMoc3ViZ2VudXMpKQpgYGAKCiMjIyBieSAqKl9zdGF0ZSBvbmx5XyoqCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiAlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyhsYWJlbCA9IHNwZWNpZXMpKSArIAogICMgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IGJpbiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzKSwKICAjICAgICAgICAgICAjIGNvbG9yID0gIiNFRUM2NDMiLAogICMgICAgICAgICAgIHNpemUgPSAxLjI1KSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiaW5fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICAgICAgICAgICAgICMgY29sID0gIiNFRUM2NDMiLAogICAgICAgICAgICAgIyBhbHBoYSA9IDAuNzUpICsgCiAgIyBnZW9tX3RleHQobWFwcGluZyA9IGFlcyh4ID0gdF9wZXJpb2QsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biArIDAuMSksCiAgIyAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogICMgZ2VvbV9kbChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAjICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwZWNpZXMpLAogICMgICAgICAgICBtZXRob2QgPSAibGFzdC5wb2ludHMiLAogICMgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gYmluXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjEpICsKICAjIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjMzgyQjAxIiwKICAjICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiI0Y0RTNBNyIpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjA1LCAwLjc1KSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMC41KSkgKyAKICAjIGNvb3JkX2ZpeGVkKHJhdGlvID0gMikgKyAKICBmYWNldF9ncmlkKHZhcnMoc3ViZ2VudXMpKQpgYGAKCiMjIyBieSAqKl9jb3VudHlfKioKYGBge3J9CmJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyhsYWJlbCA9IHNwZWNpZXMpKSArIAogICMgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IGJpbiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzKSwKICAjICAgICAgICAgICAjIGNvbG9yID0gIiNFRUM2NDMiLAogICMgICAgICAgICAgIHNpemUgPSAxLjI1KSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiaW5fOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICAgICAgICAgICAgICMgY29sID0gIiNFRUM2NDMiLAogICAgICAgICAgICAgIyBhbHBoYSA9IDAuNzUpICsgCiAgIyBnZW9tX3RleHQobWFwcGluZyA9IGFlcyh4ID0gdF9wZXJpb2QsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biArIDAuMSksCiAgIyAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogICMgZ2VvbV9kbChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAjICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwZWNpZXMpLAogICMgICAgICAgICBtZXRob2QgPSAibGFzdC5wb2ludHMiLAogICMgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gYmluXzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjEpICsKICAjIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjMzgyQjAxIiwKICAjICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiI0Y0RTNBNyIpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjA1LCAxLjApKSArIAogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLjAxLCAwLjUpKSArIAogICMgY29vcmRfZml4ZWQocmF0aW8gPSAyKSArIAogIGZhY2V0X2dyaWQodmFycyhzdWJnZW51cykpCmBgYAoKIyBSZWxhdGUgY2hhbmdlIGluIGFnIHdpdGggY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZQojIyBSZWFkIGluIGRhdGEKYGBge3J9CmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmIDwtIHJlYWRfY3N2KCIuL2J1bWJsZXNfZGVsdGFyZWxhYnVuLmNzdiIpCmJ1bWJsZXMuc3BlY2llcy5zdWJnZW51cy5kZiA8LSBidW1ibGVzLmRmICU+JQogIGdyb3VwX2J5KHNwZWNpZXMsIHN1YmdlbnVzKSAlPiUKICBkaXN0aW5jdChzcGVjaWVzKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5kZiA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5kZiAlPiUKICBsZWZ0X2pvaW4oYnVtYmxlcy5zcGVjaWVzLnN1YmdlbnVzLmRmLAogICAgICAgICAgICBieSA9ICJzcGVjaWVzIikKbWlkd2VzdGFnLmRmIDwtIHJlYWRfY3N2KCIuL21pZHdlc3RhZy5jc3YiKQpgYGAKCiMjIENvbWJpbmUgZGF0YQpgYGB7cn0KYnVtYmxlLmJ5LmFnLmRmIDwtIG1pZHdlc3RhZy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KFNUQVRFX05BTUUsIAogICAgICAgICAgICAgICAgQ05UWV9OQU1FLCAKICAgICAgICAgICAgICAgIFNVQl9SRUdJT04sIAogICAgICAgICAgICAgICAgYWdfc3RhdF9uYW1lLCAKICAgICAgICAgICAgICAgIGFnX3N0YXRfdmFsdWUsIAogICAgICAgICAgICAgICAgeWVhciwgCiAgICAgICAgICAgICAgICBzdGF0LCAKICAgICAgICAgICAgICAgIGFnX2RlbHRhKSAlPiUKICBncm91cF9ieShTVEFURV9OQU1FLCBDTlRZX05BTUUsIHN0YXQpICU+JQogIHN1bW1hcmlzZShtZWFuX2FnX2RlbHRhID0gbWVhbihhZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkgJT4lCiAgbGVmdF9qb2luKGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmLAogICAgICAgICAgICBieSA9IGMoIkNOVFlfTkFNRSIgPSAiY291bnR5IiwgCiAgICAgICAgICAgICAgICAgICAiU1RBVEVfTkFNRSIgPSAic3RhdGVfZnVsbCIpKQpgYGAKCiMjIFBsb3QgYGRlbHRhX2FnYCB2cyBgZGVsdGFfcmVsYWJ1bmAgYnkgc3BlY2llcyB3L292ZXJhbGwgYXZlcmFnZQpgYGB7cn0KYnVtYmxlLmJ5LmFnLnBsb3QgPC0gYnVtYmxlLmJ5LmFnLmRmICU+JQogIGZpbHRlcihzdGF0ID09ICJSQVRJTyIpICU+JQogIGZpbHRlcighaXMubmEobWVhbl9kZWx0YV9yYSkpICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4wLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IDAuNzUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjAsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gMC43NSwKICAgICAgICAgICAgIGFscGhhID0gMC4yNSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBzcGVjaWVzKSwKICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX2RlbHRhX3JhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIHNlID0gRkFMU0UpICsgCiAgIyBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnX2RlbHRhLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9kZWx0YV9yYSksCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICMgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAjICAgICAgICAgICAgIHNpemUgPSAxLjUpICsgCiAgeGxpbSgtMC4wMjUsIDAuMDc1KSArIAogIHlsaW0oLTEsIDEpICsKICB4bGFiKCJNZWFuIGNoYW5nZSBpbiBjb3VudHktbGV2ZWwgcHJvcG9ydGlvbiBhZyIpICsgCiAgeWxhYigiTWVhbiBjaGFuZ2UgaW4gcmVsYXRpdmUgYWJ1bmRhbmNlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSkgKyAKICBmYWNldF93cmFwKH4gc3ViZ2VudXMsCiAgICAgICAgICAgICBuY29sID0gNCkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZ3JheTUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiKSkKCmJ1bWJsZS5ieS5hZy5wbG90IDwtIGRpcmVjdC5sYWJlbChidW1ibGUuYnkuYWcucGxvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJleHRyZW1lLmdyaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXggPSAwLjUpKQpidW1ibGUuYnkuYWcucGxvdApnZ3NhdmUoIi4vYnVtYmxlX2J5YWdfcGxvdC5wbmciLAogICAgICAgYnVtYmxlLmJ5LmFnLnBsb3QsCiAgICAgICBoZWlnaHQgPSA0LjUsCiAgICAgICB3aWR0aCA9IDcpCgpgYGAKCiMjIERlbnNpdHkgcGxvdCBvZiBjb3VudHktbGV2ZWwgYXZlcmFnZSBhZyBjaGFuZ2UgZm9yIGVhY2ggc3RhdGUKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4wLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBnZW9tX2RlbnNpdHkoZGF0YSA9IGJ1bWJsZS5ieS5hZy5kZiAlPiUKICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdCA9PSAiUkFUSU8iKSAlPiUKICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKG1lYW5fZGVsdGFfcmEpKSwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gc3RhdGUpLAogICAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iLAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEpICsgCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgUGxvdCBhZyByYXRpbyB2cyBgZGVsdGFfcmVsYWJ1bmAgYnkgc3BlY2llcyB3L292ZXJhbGwgYXZlcmFnZQpgYGB7cn0KYnVtYmxlLmJ5LmFncmF0aW8ucGxvdCA8LSBtaWR3ZXN0YWcuZGYgJT4lCiAgZHBseXI6OnNlbGVjdChTVEFURV9OQU1FLCAKICAgICAgICAgICAgICAgIENOVFlfTkFNRSwgCiAgICAgICAgICAgICAgICBTVUJfUkVHSU9OLCAKICAgICAgICAgICAgICAgIGFnX3N0YXRfbmFtZSwgCiAgICAgICAgICAgICAgICBhZ19zdGF0X3ZhbHVlLCAKICAgICAgICAgICAgICAgIHllYXIsIAogICAgICAgICAgICAgICAgc3RhdCwgCiAgICAgICAgICAgICAgICBhZ19kZWx0YSkgJT4lCiAgZmlsdGVyKHN0YXQgPT0gIlJBVElPIikgJT4lCiAgZ3JvdXBfYnkoU1RBVEVfTkFNRSwgQ05UWV9OQU1FKSAlPiUKICBzdW1tYXJpc2UobWVhbl9hZyA9IG1lYW4oYWdfc3RhdF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkgJT4lCiAgbGVmdF9qb2luKGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmLAogICAgICAgICAgICBieSA9IGMoIkNOVFlfTkFNRSIgPSAiY291bnR5IiwgCiAgICAgICAgICAgICAgICAgICAiU1RBVEVfTkFNRSIgPSAic3RhdGVfZnVsbCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKG1lYW5fZGVsdGFfcmEpKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnLAogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9kZWx0YV9yYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHNwZWNpZXMpLAogICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHNwZWNpZXMpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgc2UgPSBGQUxTRSkgKyAKICAjIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IG1lYW5fYWcsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX2RlbHRhX3JhKSwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgIyAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLAogICMgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKyAKICB4bGltKDAsIDEpICsgCiAgeWxpbSgtMSwgMSkgKwogIHhsYWIoIk1lYW4gY291bnR5LWxldmVsIHByb3BvcnRpb24gYWciKSArIAogIHlsYWIoIk1lYW4gY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEpICsgCiAgZmFjZXRfd3JhcCh+IHN1YmdlbnVzLAogICAgICAgICAgICAgbmNvbCA9IDQpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImdyYXk1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IikpCgpidW1ibGUuYnkuYWdyYXRpby5wbG90IDwtIGRpcmVjdC5sYWJlbChidW1ibGUuYnkuYWdyYXRpby5wbG90LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgic21hcnQuZ3JpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNleCA9IDAuNSkpCmJ1bWJsZS5ieS5hZ3JhdGlvLnBsb3QKZ2dzYXZlKCIuL2J1bWJsZV9ieWFncmF0aW9fcGxvdC5wbmciLAogICAgICAgYnVtYmxlLmJ5LmFncmF0aW8ucGxvdCwKICAgICAgIGhlaWdodCA9IDQuNSwKICAgICAgIHdpZHRoID0gNykKYGBgCgo=